package com.hmall.gateway.filters;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpHeaders;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

//登录校验必须在请求转发到微服务之前做，否则就失去了意义。
@Component
//通过实现 GlobalFilter 接口，声明这是一个全局过滤器，会对所有经过网关的请求生效。
// 通过实现Ordered控制过滤器的执行顺序（优先级）
public class MyGlobalFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //ServerWebExchange：封装了 HTTP 请求和响应的上下文对象，可以操作请求、响应、头信息等。--实现类封装的
        //GatewayFilterChain：过滤器链，用于将处理权传递给下一个过滤器。--实现类封装的

        //TODO 模拟登录逻辑
        ServerHttpRequest request = exchange.getRequest();
        HttpHeaders headers = request.getHeaders();
        System.out.println("headers = "+ headers);
        //放行
        return chain.filter(exchange); //将处理权交给下一个过滤器，最终路由到目标服务。
    }

    @Override
    public int getOrder() {
        return 0;//数字越大，优先级越低  NettyRoutingFilter是优先级是int类型的最大值，他的优先级最低
        //NettyRoutingFilter是把请求转发到具体的微服务上的，所以说，自定义的过滤器要比他的优先级大，配置才能生效
    }
}
